package 校招笔试.美团笔试.美311;

import org.junit.Test;

import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;

/**
 * @author aodre , QQ : 480029069
 * @date 2023/3/12 10:10
 */
public class Solution {


    /*
     1. 直接暴力模拟就行
     */

    public int solutionOne(String s){
        char[] chars = s.toCharArray();
        int count = 0;
        for(int i = 1;i < chars.length;i++){
            if(chars[i] == chars[i - 1] ){
                count++;
                chars[i] = 'a';
            }
        }
        return count;
    }

    @Test
    public void test1(){
//        String s = "111222333";
        String s = "11111111";
        System.out.println(solutionOne(s));
    }


    /*
     2.  （移步  **美团的最大收益** ）
      这个题，递归的顺序进行一个新的 思考！
      不仅要会正序， 也要回倒序！
      这个 没法倒序吗 ?  根据这个题的逻辑 好像是没法 倒序的，
      所以 正序的 方式也要掌握！
     */

    public int recursion(int i,int j,int n,int m,int colors[][],int reward[][],int k){
        if(i == n || j == m ){
            return 0;
        }
        int ans = 0,ans1; // 当前 f[i][j] 收益的初始值, 要注意 一下 f[i][j] 的一个 含义

        if(i + 1 < n){ // 你不判断, 数组 会 越界的!
            if(colors[i +1][j] == colors[i][j]){
                ans = recursion(i + 1,j,n,m,colors,reward,k) + reward[i + 1][j];
            }
            // 尝试走着 看看
            ans = Math.max(ans,recursion(i + 1,j,n,m,colors,reward,k) - k + reward[i + 1][j]);

        }
        return ans;

    }


    /*
     3.
     流星
     https://leetcode.cn/circle/discuss/VbYrF4/

    lc : 2251 这两个题对比一下;


    这个题, 其实 跟 左程云的 **线段的最大重合** 这个题是 类似的做法
    但是 这个 流星的这个题, 有点不太一样的点: 就是 这里的 时间点 在 同一个 start 点上的时候 是计算在内
    而 ** 线段的最大重合 这 道 题, (2,3) (3,4) 是没有重合区间的, 而 流星这道题 3 就是重合区间, 也要去计算的!**
    而且 还 多让 计算一个 重合 区间所覆盖的 **点数和**, 也就是 该题的 最佳观测 时刻的 个数, (这一点,还是有点小小的 观察 一下!)
    比那个题要难一些!
     */

    public static int[] heapFunction(int nums[][]){
        // 按照开始时间进行一个排序
        Arrays.sort(nums,(a , b) -> {return a[0] - b[0];});
        // 准备一个小根堆

        PriorityQueue<Integer> minHeap = new PriorityQueue<>();
        int ans = 0,count = 0;
        for(int i = 0;i < nums.length;i++){
            while(!minHeap.isEmpty() && minHeap.peek() < nums[i][0]){
                minHeap.poll();
            }
            minHeap.add(nums[i][1]);
            if(ans == minHeap.size()){
                count += minHeap.peek() - nums[i][0] + 1;
            }else if(ans < minHeap.size()){
                ans = minHeap.size();
                count = minHeap.peek() - nums[i][0] + 1;
            }
        }
        return new int []{ans,count};
    }


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int nums [][] = new int[n][2];
        for(int i = 0;i < n;i++){
            nums[i][0] = sc.nextInt();
        }
        for(int i = 0;i < nums.length;i++){
            nums[i][1] = sc.nextInt();
        }
        int[] ints = heapFunction(nums);
        System.out.println(ints[0] + " " + ints[1]);

    }





}
